﻿using Furion.DistributedIDGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FurStudy.Core
{
    /// <summary>
    /// 分布式ID
    /// </summary>
    public class DistributedID
    {
        #region 连续GUID方式

        public void ContinuityGUID()
        {
            // 1、静态IDGen方式
            // 如果在循环中使用IDGen静态类方式，性能最差，原因是底层不断解析服务。如果非循环中，性能等于下面两种用法
            var guid = IDGen.NextID();

            // 还可以配置更多参数
            var guid2 = IDGen.NextID(new SequentialGuidSettings { LittleEndianBinary16Format = true });    // SequentialGuidSettings参数取决于你的分布式ID的实现

            // 3、SequentialGuidIDGenerator方式
            var idGen = new SequentialGuidIDGenerator();
            var guidSG = idGen.Create();
            // 更多参数
            var idGen2 = new SequentialGuidIDGenerator();
            var guidSG2 = idGen2.Create(new SequentialGuidSettings { LittleEndianBinary16Format = true });
        }

        /// <summary>
        /// 2、IDistributedIDGenerator注入方式 推荐
        /// </summary>
        private readonly IDistributedIDGenerator _idGenerator;

        public DistributedID(IDistributedIDGenerator idGenerator)
        {
            _idGenerator = idGenerator;
            var guidObject = _idGenerator.Create();
        }


        #endregion

        #region 短ID

        // 短ID按道理不应该放在分布式ID生成这个章节，它的作用用途常用于并发不强的内部系统中，比如任务ID，Issue编号等等

        public void ShortID()
        {
            var shortID = ShortIDGen.NextID(new GenerationOptions 
            {
                UseNumbers = false, // 不包含数字
                UseSpecialCharacters = true, // 包含特殊符号
                Length = 8, // 设置长度，注意：不设置次长度是随机长度！！！！！！
            });

            // 自定义生成端ID参与运算字符
            string characters = "ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫"; //whatever you want;
            ShortIDGen.SetCharacters(characters);

            // 自定义随机数(for)步长
            int seed = 1939048828;
            ShortIDGen.SetSeed(seed);

            // 重载所有自定义配置
            ShortIDGen.Reset();
        }

        #endregion
    }
}
